// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GenericTeamAgentInterface.h"
#include "UObject/Object.h"

#include "UObject/WeakObjectPtr.h"
#include "LyraTeamAgentInterface.generated.h"

#define UE_API LYRAGAME_API

template <typename InterfaceType> class TScriptInterface;

/**
 * Lyra团队索引变化委托，包含三个参数：改变团队的对象、旧团队ID、新团队ID
 */
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnLyraTeamIndexChangedDelegate, UObject*, ObjectChangingTeam, int32, OldTeamID, int32, NewTeamID);

/**
 * 将通用团队ID转换为整数
 */
inline int32 GenericTeamIdToInteger(FGenericTeamId ID)
{
	return (ID == FGenericTeamId::NoTeam) ? INDEX_NONE : (int32)ID; // 如果没有团队返回INDEX_NONE，否则返回整数值
}

/**
 * 将整数转换为通用团队ID
 */
inline FGenericTeamId IntegerToGenericTeamId(int32 ID)
{
	return (ID == INDEX_NONE) ? FGenericTeamId::NoTeam : FGenericTeamId((uint8)ID); // 如果是INDEX_NONE返回无团队，否则创建通用团队ID
}

/** 可以与团队关联的角色的接口 */
UINTERFACE(MinimalAPI, meta=(CannotImplementInterfaceInBlueprint))
class ULyraTeamAgentInterface : public UGenericTeamAgentInterface
{
	GENERATED_UINTERFACE_BODY() // 生成UInterface主体
};

class ILyraTeamAgentInterface : public IGenericTeamAgentInterface
{
	GENERATED_IINTERFACE_BODY() // 生成IInterface主体

	/**
	 * 获取团队索引变化委托
	 */
	virtual FOnLyraTeamIndexChangedDelegate* GetOnTeamIndexChangedDelegate() { return nullptr; } // 返回团队索引变化委托

	/**
	 * 条件性地广播团队变化
	 */
	static UE_API void ConditionalBroadcastTeamChanged(TScriptInterface<ILyraTeamAgentInterface> This, FGenericTeamId OldTeamID, FGenericTeamId NewTeamID);
	
	/**
	 * 获取团队变化委托（已检查）
	 */
	FOnLyraTeamIndexChangedDelegate& GetTeamChangedDelegateChecked()
	{
		FOnLyraTeamIndexChangedDelegate* Result = GetOnTeamIndexChangedDelegate(); // 获取委托
		check(Result); // 检查结果有效性
		return *Result; // 返回委托引用
	}
};

#undef UE_API // 取消定义UE_API宏